-- stack: in.0 -- format: 8 (HyperCard 1) -- flags: 0x9000 (can't modify) -- protect password hash: 0 -- maximum user level: 5 (scripting) -- window: Rect(x1=0, y1=0, x2=0, y2=0) -- screen: Rect(x1=0, y1=0, x2=0, y2=0) -- card dimensions: w=0 h=0 -- scroll: x=0 y=0 -- background count: 3 -- first background id: 3618 -- card count: 621 -- first card id: 3356 -- list block id: 2406 -- print block id: 0 -- font table block id: 0 -- style table block id: 0 -- free block count: 0 -- free size: 0 bytes -- total size: 818688 bytes -- stack block size: 31232 bytes -- created by hypercard version: 0x01258000 -- compacted by hypercard version: 0x01258000 -- modified by hypercard version: 0x01258000 -- opened by hypercard version: 0x01258000 -- patterns[0]: 0x0000000000000000 -- patterns[1]: 0x8000000008000000 -- patterns[2]: 0x8800220088002200 -- patterns[3]: 0x8888222288882222 -- patterns[4]: 0x88AA22AA88AA22AA -- patterns[5]: 0xCCAA33AACCAA33AA -- patterns[6]: 0xEEAABBAAEEAABBAA -- patterns[7]: 0xEEBBBBEEEEBBBBEE -- patterns[8]: 0xFFBBFFEEFFBBFFEE -- patterns[9]: 0xFFBBFFFFFFBBFFFF -- patterns[10]: 0x8010022001084004 -- patterns[11]: 0xFFFFFFFFFFFFFFFF -- patterns[12]: 0x8822882288228822 -- patterns[13]: 0x1122448811224488 -- patterns[14]: 0xC4800C6843023026 -- patterns[15]: 0xB130031BD8C00C8D -- patterns[16]: 0xAA00AA00AA00AA00 -- patterns[17]: 0x8822552288225522 -- patterns[18]: 0x8855225588552255 -- patterns[19]: 0x77DD77DD77DD77DD -- patterns[20]: 0x8000000000000000 -- patterns[21]: 0xAA55AA55AA55AA55 -- patterns[22]: 0x038448300C020101 -- patterns[23]: 0x8244394482010101 -- patterns[24]: 0x8814224188412214 -- patterns[25]: 0x8080413E080814E3 -- patterns[26]: 0x22048C7422179810 -- patterns[27]: 0xBE808808EB088880 -- patterns[28]: 0x25C8328964244C92 -- patterns[29]: 0xA29C41BE2AC914EB -- patterns[30]: 0x40A00000040A0000 -- patterns[31]: 0x8040200002040800 -- patterns[32]: 0xAA00800088008000 -- patterns[33]: 0xFF80808080808080 -- patterns[34]: 0x081C22C180010204 -- patterns[35]: 0xFF808080FF080808 -- patterns[36]: 0xF87422478F172271 -- patterns[37]: 0xBF00BFBFB0B0B0B0 -- patterns[38]: 0xFF7FBE5DA2418000 -- patterns[39]: 0xFAF5FAF5A050A050 -- checksum: 0x0 ----- HyperTalk script ----- --•• SYSTEM MESSAGES on openStack global firstTimeAGS,artManagement,findParams,lastFindTerms if the version < 1.2 then dialogIt "Sorry. You need HyperCard version 1.2 or greater." && "You are using version" & the version & "." end if if firstTimeAGS is empty then -- This is the first time you have opened the stack in this -- HyperCard session. put false into artManagement end if show menubar put empty into findParams put empty into lastFindTerms pass openStack end openStack on closeStack global artManagement,taggedList saveChanges true,taggedList,true if artManagement then set cursor to busy lock screen set lockMessages to true set lockRecent to true go bg "the collection" send "adminElements false" to this bg end if pass closeStack end closeStack on arrowKey whichKey set textArrows to not (selectedChunk() is empty) pass arrowkey end arrowKey on domenu menu --// Added by Medior, Inc. 8/8/90 global RPStackName if menu is in "Home,Quit HyperCard" and RPStackName is not empty then set cursor to watch put RPStackName into shortname repeat until offset(":",shortname) = 0 delete char 1 to offset(":",shortname) of shortname end repeat delete last char of shortname answer "This will return to "&shortname&"." with "Cancel" or "OK" if it is "Cancel" then exit domenu set cursor to watch lock screen go RPStackName unlock screen with dissolve exit domenu else pass doMenu end domenu --•• MESSAGE HANDLERS on goStack whichStack if the hilite of the target then exit goStack set lockMessages to true set lockRecent to true lock screen go stack "Apple Graphics - " & whichStack answer "Check the stack name to see if its changed." go bg "the collection" unlock screen with visual effect dissolve openBackground openCard end goStack on admin global artManagement put true into artManagement send "adminElements true" to this bg if the cantModify of this stack then dialogIt "To use the developer buttons in the background" && "The Collection, move this stack to an unlocked volume." end if end admin on closeAdmin global artManagement put false into artManagement send "adminElements false" to this bg end closeAdmin on selectLine whichLine,whichFld --whichLine is a wholeNumber and whichFld is the short name of a fld. if whichLine = empty OR whichFld = empty then exit selectLine put line whichLine of fld whichFld into theText if theText is not empty then put (number of chars of line 1 to whichLine of fld whichFld) + 1 into endChar select char (endChar - length (theText)) to endChar of fld whichFld wait 5 end if end selectLine on stopBtnStatus boolean set visible of fld "status" to boolean end stopBtnStatus on showProgress whichText, whichPercent put whichText && "(" & whichPercent & "% Complete" & ")" end showProgress on hideProgress put empty hide msg end hideProgress on toggleLockScreen unlock screen lock screen unlock screen end toggleLockScreen on showListName global activeListName if the short name of this bg is not "the collection" then go bg "the collection" end if set the name of bg btn id 353 to "List Name:" && activeListName end showListName on goListStack thisCard --Takes you to the list stack, or returns "no" if this is unsuccesful. --thisCard, the name of the card in the list stack --you want to go to. is optional. global listStack lock screen set lockMessages to true set lockRecent to true go stack listStack if the short name of this stack <> listStack then exit to hypercard if cantModify of this stack then dialogIt "The stack" && quote & listStack & quote && "is locked." && "You can't save changes to your lists until you unlock" && "the stack" && quote & listStack & quote & "." return "no" end if if thisCard is not empty then go cd thisCard if the result is not empty then --this card wasn't found dialogIt "The card" && thisCard && "was not found in" && "the stack" && listStack && "." return "no" end if end goListStack --LIST scripts on deleteListEntries whichField set cursor to arrow lock screen send "deleteEntryVisible true" to this cd put the rect of the name of whichField into listRect put listRect into validArea subtract 17 from item 3 of validArea --17 is the width of the scroll bar unlock screen with barn door open repeat wait while the mouse is up --the user clicked the mouse put the clickLoc into userLoc if userLoc is within the rect of (the name of whichField) AND userLoc is not within validArea then --user clicked on the scroll bar next repeat end if if userLoc is NOT within validArea OR (the name of whichField) = empty then exit repeat put clickLine(the name of whichField) into whatLine if line whatLine of (the value of whichField) = empty then exit repeat end if if isEvenNumber(whatLine) then subtract 1 from whatLine repeat 2 times send "selectLine whatLine, the short name of whichField" to this cd do "delete line whatLine of" && the name of whichField end repeat reNumberSequence whatLine,whichField set cursor to arrow end repeat send "deleteEntryVisible false" to this cd end deleteListEntries on reNumberSequence N,whichField --N is the line number of the first line that needs a new entry number global entryPrefix, entrySuffix put the value of whichField into thisField repeat until line N of thisField = empty set cursor to watch delete char 1 to the number of chars in entryPrefix of line N of thisField put (N / 2 + .5) into newNumber put beginEntryLine(newNumber) into beginLine put beginLine & newNumber & entrySuffix before line N of thisField do "put thisField into" && the name of whichField add 2 to N end repeat end reNumberSequence on findEntry whichLine,findThis,whichField global listScroll,entryPrefix if findThis is empty then exit findEntry if (whichLine/2) = trunc(whichLine/2) then -- user selected a file name put line whichLine of the value of whichField into uniqueNumber else -- user selected a name put line (whichLine+1) of the value of whichField into uniqueNumber end if -- get rid of extra characters delete char 1 to (the number of chars in entryPrefix) of uniqueNumber if the short name of this bg is not "the collection" then go bg "the collection" end if find whole uniqueNumber in fld "file name field" if the foundText is empty then dialogIt "In this stack, there isn’t a graphic with the file name" && quote & uniqueNumber & quote & "." exit findEntry end if set scroll of fld "list" to listScroll unlock screen with visual effect wipe left end findEntry on saveChanges dialogNeeded,toBeSaved,savingOpenList global activeListName,changesToList,taggedList --dialogNeeded = true if a dialog is needed asking the user --if they want to save changes. --savingOpenList = false if you are saving a list that is not --the active list (as you can do on the Focus card). -- Return true if the save was completed and succesfully. -- Otherwise, it return false. put the long name of this cd into afterSaveGoHere if savingOpenList then if changesToList is not true then return false --the exit was made because a save was unnecessary. if dialogNeeded then -- The user needs to be asked if they want to save changes. dialogIt "Save changes to the list " & quote & activeListName & quote & "?", "No,Yes" if the result is "No" then -- The user doesn't want to save the current list. put "Untitled" into activeListName put false into changesToList put empty into taggedList exit saveChanges end if end if end if if activeListName is "untitled" OR activeListName is empty then --Get a name for the list checkListName "Save the list as (15 letters or less):" if the result is not empty then return false --you are at the new list card. end if goListStack activeListName if the result is "no" then go afterSaveGoHere return false end if set cursor to busy put toBeSaved into fld "tagged list" go afterSaveGoHere set cursor to busy if savingOpenList then put false into changesToList showListName end if return true end saveChanges on checkListName prompt,default -- If list entered is invalid, return a non-empty value. global activeListName if default = "untitled" then put empty into default ask prompt with default put it into whichName if whichName = empty then return "1" else if not validListName(whichName) then checkListName prompt,default exit checkListName end if -- You're in the list stack. put whichName into activeListName go last cd of this bg doMenu "new card" set the name of this cd to activeListName end checkListName on dialogIt whichText, whichButtons, whichFont, whichIcon if whichButtons is empty then put "OK" into whichButtons if whichIcon is empty then put "0" into whichIcon if whichFont is empty then put "chicago" into whichFont get dialog(whichText,whichButtons,whichIcon,whichFont,plain,12) return it end dialogIt --• THESE SCRIPTS USE THE POINTERS TO FIND SPECIFIC CARDS. on findAGS dialogPhrase,indexField,pointerField,writeField,goForward global findParams,lastFindTerms if the number of lines in lastFindTerms > 1 then put getCardIdIntersection(lastFindTerms,pointerField,writeField) into validFileNames else put getValidFileNames(lastFindTerms,pointerField,writeField) into validFileNames end if put binaryInsert(bg fld "file name field",validFileNames) into thisItem -- thisItem is the item number in validFileNames of the NEXT valid -- file name in the stack. put allFoundPrefix(lastFindTerms,dialogPhrase) into allFound put noneFoundPrefix(lastFindTerms,dialogPhrase) into noneFound if thisItem = 0 then dialogIt noneFound exit findAGS end if if not goForward then put advanceItem(thisItem,goForward,validFileNames) into thisItem end if lock screen repeat with N = (the number of items in validFileNames) down to 1 if the mouseClick then exit repeat put getCardId(item thisItem of validFileNames) into thisCardId if thisCardId is empty then exit repeat go cd id thisCardId if the result is not empty then next repeat if the number of lines in lastFindTerms = 1 then put getLine(lastFindTerms,bg fld indexField) into thisLine if thisLine is empty then next repeat end if -- There is an exact match. updateStatus N stopBtnStatus true if goForward then unlock screen with visual effect wipe left else unlock screen with visual effect wipe right if the number of lines in lastFindTerms = 1 then selectLine thisLine,indexField end if if N <> the number of items in validFileNames then -- This is not the first time through if shallWeStop() then exit repeat end if lock screen put empty into fld "Status" put advanceItem(thisItem,goForward,validFileNames) into thisItem if N = 1 then -- You've gone to all of the appropriate cards, so stop. wait 30 stopBtnStatus false unlock screen wait 40 if not the mouseClick then dialogIt allFound end if end repeat put the params into findParams stopBtnStatus false put empty into bg fld "status" end findAGS on updateStatus cardsLeft if cardsLeft = 1 then put "occurrence" into phrase else put "occurrences" into phrase put cardsLeft && phrase && "left. Click and Hold to Stop." into fld "status" end updateStatus --• THESE SCRIPTS HANDLE THE POINTERS. on buildPointers indexField,writeField,pointerField put readIndex(writeField) into thisIndex put the number of lines in thisIndex into numberOfEntries set cursor to watch lock screen set lockMessages to true put "Building pointers for" && writeField into status repeat with N = 1 to numberOfEntries showProgress status,round(N/(numberOfEntries)*100) put line N of thisIndex into whichText if whichText = empty OR whichText = space then next repeat go cd 1 of bg "the collection" put empty into entries put empty into firstCard put empty into currentCard repeat find whole whichText in fld indexField if the foundChunk is empty then --The text wasn't found in the specified field. exit repeat end if put word 2 of the foundLine into thisLine if whichText <> line thisLine of fld indexField then --There was a find, but not an exact match, so look again. next repeat end if if firstCard = empty then put the short id of this cd into firstCard else put the short id of this cd into currentCard if firstCard = currentCard then --you've been to all of the valid cards. exit repeat end if --If it got this far, then there was an exact match. put bg fld "file name field" & "," after entries end repeat put the number of chars in whichText into fldNumber put last char of fldNumber into fldNumber if last char of entries is "," then delete last char of entries writePointer entries,N,pointerField && fldNumber end repeat hideProgress end buildPointers on writePointer newPointer,lineNumber,fldName put newPointer into line lineNumber of cd fld fldName of cd "Index storage" end writePointer --•• END AGS ONLY --•• FUNCTIONS function diskSpaceAvailable -- Return true if the disk space available is greater than the -- limit given. Otherwise, return false. if the diskSpace > 5000 then return true put the long name of this stack into stackName delete char 1 to 7 of stackName delete last char of stackName put volumeName(stackName) into diskName put round(the diskSpace / 1000) into spaceAvailable dialogIt "There is" && spaceAvailable & "K of disk space" && "available on" && quote & diskName & quote & ". Since this may" && "not be enough disk space to continue, the current task has been" && "stopped. You should move this stack to a disk with more" && "space available before continuing this task." return false end diskSpaceAvailable function isWithin thisText, container -- Return true of thisText is a complete line in the given container. if line 1 of container = thisText OR container contains return & thisText & return OR thisText = last line of container then return true return false end isWithin function clickLine whichField -- Return the number of the line clicked. -- First, determine how many lines are hidden above if the style of whichField is "scrolling" then put the scroll of whichField into theScroll else put 0 into theScroll put (theScroll / textHeight of whichField) into linesAbove -- add that number to the relative position clicked return round(linesAbove + lineClicked(whichField)) end clickLine function lineClicked whichField return ((the mouseV - item 2 of the rect of whichField - 4) div the textheight of whichField) + 1 end lineClicked function beginEntryLine entryNumber if entryNumber < 10 then return space & space if entryNumber < 100 then return space if entryNumber < 1000 then return empty end beginEntryLine function isEvenNumber whatString --returns true if the given string is an even number. if not positiveWholeNumber(whatString) then return false if whatString mod 2 = 0 then return true return false end isEvenNumber function linesVisible whichFld --returns the number of lines that are visible in a field. return round(height of whichFld/the textHeight of whichFld) end linesVisible function readIndex writeField return cd fld writeField of cd "Index storage" end readIndex function getLine whichText,container --Where whichText is any text string. --Returns the line number of the given text in the given container. --Returns empty if an entire line in the container does not equal --whichText. --Note that OFFSET won't work because you're looking for --an entire line, not just a subset. if whichText = line 1 of container then return 1 put offset(return & whichText & return,container) into theChars if theChars <> 0 then return (the number of lines in char 1 to theChars of container) + 1 end if if whichText = last line of container then return (the number of lines in container) end if return empty end getLine function listDialog thelist,delimit,text,selectMode,theButtons,dlogNo global ListSelectExit --ListSelectExit is the name of the button the user clicked to leave --the dialog box. if delimit is 13 then put return into delimit get ListSelect(selectMode,theList,text,theButtons,delimit,dlogNo) return it end listDialog function sortContainer whichContainer --returns the given container sorted alphabetically. put alphaSort(whichContainer) into it return it end sortContainer function substitute originalChar, newChar, whichContainer --returns the given container with the given existing character --substituted in all cases for the given new character. repeat put offset(originalChar,whichContainer) into whichChar if whichChar = 0 then exit repeat put newChar into char whichChar of whichContainer end repeat return whichContainer end substitute function validListName whichName if whichName is empty then return false if whichName is "Untitled" then answer "List can't be named Untitled." return false end if if whichName is "id" then answer "Lists can't be named ID." return false end if if the length of whichName > 15 then answer "List names cannot have more than 15 letters." return false end if if nonNegativeNumber(whichName) then dialogIt "List names must contain at least one letter." && "The list name" && quote & whichName & quote && "is invalid." return false end if goListStack if the result is "no" then pop cd exit to hypercard end if go bg "lists" repeat with i = 1 to (the number of cds in this bg) if the short name of this cd = whichName then dialogIt "There is already a list named" &"e& whichName "e& ". Please use a different name." return false end if go next cd of this bg end repeat return true end validListName function positiveWholeNumber whatString -- If whatString is a positive whole number, returns true. -- Otherwise, returns false. if not containsANumber(whatString) then return false repeat with i = 1 to the length of whatString if "1234567890" contains char i of whatString then next repeat else return false end repeat -- The final test if whatString > 0 then return true else return false end positiveWholeNumber function nonNegativeNumber whatString --returns true if the given string is a non-negative number. if containsANumber(whatString) = false then return false repeat with i = 1 to the length of whatString if ".1234567890" contains char i of whatString then next repeat else -- if it makes it here, there is an invalid character, -- so exit now. return false end if end repeat return true end nonNegativeNumber function containsANumber whatString --returns true if at least one of the characters in the --string is a number. Otherwise, returns false repeat with i = 1 to the length of whatString if "1234567890" contains char i of whatString then --there is at least one number, so go to the next test. exit repeat else if i = the length of whatString then --you've gone through all characters & there aren't any numbers. return false end if end repeat return true end containsANumber function getShortName longName -- Given the path to a file, return the name of the file. repeat if longName contains ":" then put offset (":",longName) into thisChar delete char 1 to thisChar of longName else exit repeat end repeat return longName end getShortName function getPath longName -- Given the full path to a file, return -- the path to the file minus the name of the file. repeat if last char of longName <> ":" then delete last char of longName else exit repeat end repeat return longName end getPath function volumeName pathName -- Given the full path to a file, return -- the name of the volume (i.e., the disk name, or top directory). put offset(":",pathName) into theChars return char 1 to (theChars - 1) of pathName end volumeName --•• FUNCTIONS (AGS ONLY) function allFoundPrefix whichText,dialogPhrase if the number of lines in whichText = 1 then return "You’ve seen all of the graphics" && dialogPhrase && quote & whichText & quote & "." else return "You've seen all of the graphics with all of the selected items." end if end allFoundPrefix function noneFoundPrefix whichText,dialogPhrase if the number of lines in whichText = 1 then return "There aren’t any graphics" && dialogPhrase && quote & whichText & quote & "." else return "There aren’t any graphics that have all of the selected items." end if end noneFoundPrefix function shallWeStop -- Pause at each card for a given amount of time. global ticksToWait put (the ticks + ticksToWait) into stopTicks repeat until stopTicks < (the ticks) if the mouse is down then return true end repeat return false end shallWeStop function advanceItem thisItem,goForward,validFileNames put thisItem into testThis if goForward then add 1 to thisItem if thisItem > the number of items in validFileNames then put 1 into thisItem end if else subtract 1 from thisItem if thisItem = 0 then put the number of items in validFileNames into thisItem end if end if return thisItem end advanceItem function getCardIdIntersection source,pointerField,writeField -- Return the card ids of all cards that meet the criteria. -- Source is a return-delimited list that determines the criteria. put getLeastItems(source,pointerField,writeField) into whichLine if whichLine is empty then return whichLine put line whichLine of source into occursLeast -- occursLeast is the text that occurs the least times in the stack. put getFileNames(occursLeast,source,writeField,pointerField) into cardIds return cardIds end getCardIdIntersection function getLeastItems object,pointerField,writeField -- Return the line number of the object that has the fewest -- occurrences in the stack. -- Object is a return-delimited list of terms (such as keywords, etc.) put empty into lowest put empty into leastItems repeat with N = 1 to the number of lines in object set cursor to busy put line N of object into whichText get numberOfOccurrences(whichText,pointerField,writeField) if lowest = empty OR it < lowest then put it into lowest put N into leastItems end if end repeat return leastItems end getLeastItems function getFileNames whichText,source,writeField,pointerField -- Given a text string, its index, and pointer field that -- has the least occurrences in the stack, return a formatted list of -- descriptions and file names that meet the criteria. put getValidFileNames(whichText,pointerField,writeField) into subset repeat with N = 1 to the number of lines in source set cursor to busy put line N of source into whichText put getValidFileNames(whichText,pointerField,writeField) into superSet put getIntersection(subset,superSet) into intersection if intersection is empty then put empty into subset exit repeat else put intersection into subset end repeat return subset end getFileNames function getCardId fileName -- Given a file name, return its card id. put cd fld "file name index" of cd "Index storage" into theIndex put getFileNameLine(fileName,theIndex) into whichLine if whichLine is empty then dialogIt "The file name" && fileName && " is not part of the" && "File Name Index. You probably need to build the File Name Index." return empty end if return item 2 of line whichLine of theIndex end getCardId function itemNumber textString,theContainer -- Return the item number of the text string in the given container if item 1 of theContainer = textString then return 1 else get offset("," & textString & ",",theContainer) if it <> 0 then get the number of items in char 1 to it of theContainer return it+1 end if if textString = last item of theContainer then return the number of items in theContainer end if return 0 end itemNumber function binaryInsert theItem,theContainer set cursor to watch -- a few quick tests up front if theContainer is empty then return 0 -- if theItem is outside the bounds of the container then return 1 if theItem > last item of theContainer OR theItem < item 1 of theContainer then return 1 -- if theItem exists in the container, then return its item number if isWithinItems(theItem,theContainer) then get itemNumber(theItem,theContainer) return it end if -- begin binary insert put the number of items of theContainer into N put 1 into S repeat put (N-S) div 2 into median put (S + median) into keyN if theItem < item keyN of theContainer then if median = 0 then put theItem & return before item keyN of theContainer exit repeat else put keyN into N next repeat end if else if median = 0 then put return & theItem after item keyN of theContainer exit repeat else put keyN into S next repeat end if end if end repeat put the number of items in line 1 of theContainer into outcome if item outcome of theContainer = theItem then return outcome else return (outcome+1) end binaryInsert function getValidFileNames whichText,pointerField,writeField -- Return the contents of the appropriate line in the appropriate -- pointer field. put nameOfPointerField(whichText,pointerField) into pointerField put getLine(whichText,readIndex(writeField)) into whichLine return line whichLine of cd fld pointerField of cd "Index storage" end getValidFileNames function nameOfPointerField whichText,pointerField -- Return the full name of the pointer field. put the length of whichText into lengthOfWhichText put pointerField && last char of lengthOfWhichText into pointerField return pointerField end nameOfPointerField function numberOfOccurrences whichText,pointerField,writeField get getValidFileNames(whichText,pointerField,writeField) return the number of items in it end numberOfOccurrences function getFileNameLine whichFileName,container -- Given a file name, this function return its line number in the -- File Name Index. if whichFileName = item 1 of line 1 of container then return 1 put offset(return & whichFileName & ",",container) into theChars if theChars <> 0 then return (the number of lines in char 1 to theChars of container) + 1 end if if whichFileName = item 1 of last line of container then return (the number of lines in container) end if return empty end getFileNameLine function getFileNameCont whichFileName,theIndex --Given a file name, this function return the contents of its --entire line in the file name index. put getIdLine(whichFileName,theIndex) into thisLine return line thisLine of theIndex end getFileNameCont function getIntersection firstList,secondList -- Given two item-delimited lists, return their intersection. if firstList = secondLIst then return firstList -- First, figure out which list is shorter. if the number of items in firstList < the number of items in secondList OR the number of items in firstList = the number of items in secondList then put firstList into subset put secondList into superSet else put secondList into subset put firstList into superSet end if put empty into intersection repeat with N = 1 to the number of items in subset set cursor to busy if isWithinItems(item N of subset,superset) then put item N of subset into item (the number of items in intersection + 1) of intersection end if end repeat return intersection end getIntersection function isWithinItems thisItem,container --returns true of thisItem is a complete item in the given container. if item 1 of container = thisItem OR container contains "," & thisItem & "," OR thisItem = last item of container then return true return false end isWithinItems --•• END AGS ONLY COPYRIGHT NOTICES AlphaSort, © Jay Hodgdon, 1989 Dialog, © Gary Bond, 1989 BigPop, © Jay Hodgdon, 1989 DisPict, © Apple Computer, 1988-1990 FIleName, © Steve Maller, 1989 FolderName, © Eric Carlson and Anup Murarka, 1989 GetFIleName, © Apple Computer, 1989-1990 ListOurFiles, © Apple Computer, 1988-1990 ListVol, © Apple Computer, 1989-1990 Mount, © Landon Dyer, 1989 ShowList, © Gary Bond, 1989 TinyPict, © Apple Computer, 1988-1990 UnMount, © Landon Dyer, 1989 (The original versions of DispPict, ListOurFiles, ListVol, and TinyPict were written by David Fry.)